package compilador.semantico.comando;

import compilador.Command;
import compilador.CommandException;
import compilador.semantico.GerenciadorDeContexto;
import compilador.semantico.SemanticException;
import compilador.semantico.TabelaSemantica;
import compilador.semantico.Tipo;
import compilador.semantico.Variavel;

public class PushIdentificadorCommand implements Command {

	@Override
	public void run(String... args) throws CommandException {
		String id = args[0];
		if (!id.equals("self")) {
			// se for self ta tudo certo!
			GerenciadorDeContexto pilha = GerenciadorDeContexto.getInstance();
			TabelaSemantica tabela = TabelaSemantica.getInstance();

			if (tabela.containsTemp(id)) {
				// se nao for preciso checar se o id eh temporario
				pilha.push(tabela.getTemp(id));
			} else {
				// se nao for, checo com o que estiver no topo da pilha de
				// contexto
				Variavel var = tabela.getTipo(pilha.top().getTipo());
				if (var != null) {
					/* var == null indica erro samantico, tipo do topo da pilha invalido
					 * contudo este erro já foi reportado pelo comando de verificação do topo
					 * simplesmente ignora! 
					 */
					if (var.temFilhos()) {
						Tipo tipo = (Tipo) var;
						pilha.push(tipo.getFilho(id));
					} else {
						throw new SemanticException("Topo da pilha invalido");
					}
				}
			}
		}
	}
}
